/**
 * 
 */
package com.pe.pgn.clubpgn.service.impl;

import java.util.Calendar;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.ClientePersonaDao;
import com.pe.pgn.clubpgn.domain.ClpbClientePersona;
import com.pe.pgn.clubpgn.domain.ClpbEmpresaCelular;
import com.pe.pgn.clubpgn.domain.ClpbEstadoCivil;
import com.pe.pgn.clubpgn.domain.ClpbTipoDocumentoPersona;
import com.pe.pgn.clubpgn.domain.ClpmUbigeo;
import com.pe.pgn.clubpgn.domain.beans.BNClientesPersona;
import com.pe.pgn.clubpgn.service.ClientePersonaService;
import com.pe.pgn.clubpgn.service.support.AbstractExposedDisplayTagService;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;

/**
 * @author edwin.farfan
 * 
 * @modify frank.ayala
 */

@Service("clientePersonaService")
public class ClientePersonaServiceImpl extends AbstractExposedDisplayTagService<ClpbClientePersona> implements ClientePersonaService {

	@Autowired
	private ClientePersonaDao clientePersonaDao;

	public ClientePersonaServiceImpl(){
		setTableId("cliente");
		setViewFragment("/wizard/clientes.html");
	}
	
	public void eliminarClientePersona(Long id) {
		clientePersonaDao.eliminarClientePersona(id);
	}

	public void guardarClientePersona(ClpbClientePersona clientePersona) {

		clientePersonaDao.guardarClientePersona(clientePersona);
	}

	public BNClientesPersona obtenerClientePersona(Long id) {
		return clientePersonaDao.obtenerClientePersona(id);
	}

	public List<ClpbClientePersona> obtenerClientePersonas() {

		return clientePersonaDao.obtenerClientePersonas();
	}

	public List<BNClientesPersona> busquedaClientesPorFiltros(String nroDocumento, String cliente, String eliminado, String habilitado, 
			String fechaInicio,String fechaFinal)throws Exception{
		
		List<BNClientesPersona> listadoClientes=clientePersonaDao.busquedaClientesPorFiltros(nroDocumento, cliente,eliminado, habilitado,fechaInicio,fechaFinal);
		
		for (BNClientesPersona bnClientesPersona : listadoClientes) {
			
			if(bnClientesPersona.getFechaInscripcion() != null){
				bnClientesPersona.setDaFechaInscripcion(CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, bnClientesPersona.getFechaInscripcion()));
			}
			
			bnClientesPersona.setStHabilitado(bnClientesPersona.getHabilitado().equals("Y")?true:false);
			bnClientesPersona.setStClientePersona(bnClientesPersona.getEliminado().equals("Y")?true:false);
			
		}
		
		return listadoClientes;
	}
	
	public List<ClpbTipoDocumentoPersona> listadoDocumentoPersonas(){
		return clientePersonaDao.listadoDocumentoPersonas(); 
	}
	public List<ClpmUbigeo> listadoDistritos(){
	
		return clientePersonaDao.listadoDistritos();
	}
	public List<ClpbEmpresaCelular> listadoEmpresaCelular(){
		return clientePersonaDao.listadoEmpresaCelular();
	}
	public List<ClpbEstadoCivil> listadoEstadoCivil(){
		return clientePersonaDao.listadoEstadoCivil();
	}
	
	public boolean getMayorDeEdad(Calendar fecha){
		
		int actual= Calendar.getInstance().get(Calendar.YEAR)-CLPConstantes.MAYORIA_DE_EDAD;
		int nacio= fecha.get(Calendar.YEAR);
		
		if (actual<nacio){
			return false;
		}
		return true;
	}
	
	public List<Map<String, Object>> verificarDuplicidadDocumento(String documento){
		return clientePersonaDao.verificarDuplicidadDocumento(documento);
	}
	
	public int validaDocumento(Long id) {
		return clientePersonaDao.validaDocumento(id);
	}
	
	public boolean clienteTieneDependencias(Long id ){
		return clientePersonaDao.clienteTieneDependencias(id);
	}

	public List<BNClientesPersona> obtenerBNClientePersonas() throws Exception {
		
		List<BNClientesPersona> listadoClientes = clientePersonaDao.obtenerBNClientePersonas();
		for (BNClientesPersona bnClientesPersona : listadoClientes) {
			
			if(bnClientesPersona.getFechaInscripcion() != null){
				bnClientesPersona.setDaFechaInscripcion(CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, bnClientesPersona.getFechaInscripcion()));
			}
			
			bnClientesPersona.setStHabilitado(bnClientesPersona.getHabilitado().equals("Y")?true:false);
			bnClientesPersona.setStClientePersona(bnClientesPersona.getEliminado().equals("Y")?true:false);			
		}
		
		return listadoClientes;
	}

	public List<BNClientesPersona> obtenerListaClientesPersona() throws Exception {
		return clientePersonaDao.obtenerListaClientesPersona();
	}

	public List<ClpbEstadoCivil> listarEstadosCiviles(boolean addItemDefault) {
		return clientePersonaDao.listarEstadosCiviles(addItemDefault);
	}
	
	//////////////
	
	@SuppressWarnings("unchecked")
	public List getObjects(int firstResult, int maxResults, String orderBy, boolean ascending, String[] filters) {
		List<BNClientesPersona> clientes = clientePersonaDao.buscarClientesPersona(firstResult, maxResults, orderBy, ascending, filters);
		return clientes;
	}

	public String getObjectsName() {
		return "clientes";
	}

	public int getNumberOfObjects(String[] filters) {
		return clientePersonaDao.obtenerNumeroClientes(filters);
	}

	public String getNumberOfObjectsName() {
		return "numberOfClientes";
	}
}
